﻿//call_once与其使用场景

#include <iostream>
using namespace std;

#include <thread>//线程

#include<mutex>//互斥锁

#include <string>

//单例模式
//比如日志，通常只需要一个完成所有打印操作



once_flag once;
class myLog
{
public:
	myLog() {};
	myLog(const myLog& log) = delete;//禁用拷贝构造
	myLog& operator=(const myLog& log) = delete;//禁用等号

	static void theInit()
	{

	}

	static myLog& getInstance()
	{
		//这个提前创建好是饿汉模式。懒汉模式是用的时候再创建。（可能反了）
		//static myLog log;//饿汉模式
		//return log;

		//懒汉模式

		/*会有这样的问题，这个只需要一个，但是t1，t2同时来，都发现空
		* 就申请2个
		*/
		/*static myLog* log = nullptr;
		if (!log) log = new myLog;
		return *log;*/
		
		static myLog* log = nullptr;
		if (!log) log = new myLog;

		call_once(once, theInit);

		return *log;
	}
	void printLog(string msg)
	{
		cout << __TIME__ << msg << endl;
	}

	
};

void printLog()
{
	myLog::getInstance().printLog("日志输出");
}


int main(void)
{
	thread t1(printLog);
	thread t2(printLog);

	/*一个函数在多个线程中被调用，保证只执行1次
	*/

	t1.join();
	t2.join();

	return 0;
}